<?php
/*
Plugin Name: Texyla
Plugin URI: http://texyla.jaknato.com/
Description: Datum: 13.12.2008 Pokus o implementaci AJAX editoru postaveného nad Texy2 a JQuery. Inspirováno pluginem Texy. Pro správnou funkčnost musíte u uživatelů zakázat používání visual editoru. Nastavení zpracování textu se provádí v configuračních souborech Texyly
Author: Petr Vaněk
Version: plugin: 0.3, Texyla: 0.5-SVN-r-140
Author URI: http://texyla.jaknato.com/
*/

/**
* TODO! 
*  - použít generovanou Texylu, *
*  - bez fileBrowseru a galerie (obojí je vyplé ale integrované) *
*  - popřípadě fileBrowser a galerii dodělat tak, aby mohli procházet adresářovou strukturu vytvořenou WordPressem v upload adresáři
*  - dořešit JS errory v administraci
*/

// load Texyla
require_once(dirname(__FILE__) . '/texyla/texyla/php/texyla.php');

// set texyla-plugin path 
$TexylaPluginPath = get_settings('siteurl') . '/wp-content/plugins/texyla-for-wordpress/';

$Texyla_cachePath = dirname(__FILE__) . '/cache/';

function texylaError($id) {
    $t = '';
	switch($id) {
		case 1:
		$t = <<< EEE
<script type="text/javascript">
alert('Pro aktivaci Texyla editoru v administraci musíte v osobním nastavení zakázat vizuální editor! For enable Texyla editor, must be disabled visual editor in User Preference page!');	
</script>
EEE;
		break;
		case 2:
			global $Texyla_cachePath;
		$t = <<< EEE
<script type="text/javascript">
alert('Nelze zapisovat do adresáře: {$Texyla_cachePath}, z toho důvodu nefunguje TexylaCache. Systém funguje dál, ale více zatěžuje server na kterém běží! Pro nápravu tohoto stavu nastavte prosím pro adresář {$Texyla_cachePath} právo zápisu a čtení. Děkuji.' );	
</script>
EEE;
		break;
	}
	echo $t;
}


/**
* přidá css a vše potřebné pro spuštění Texyly do hlavičky 
* stránky u administrace
*/
function texylaAdminAddHead() {
	global $Texyla_cachePath;
	if (user_can_richedit()) {
		return texylaError(1);
	}
	if (!is_writable($Texyla_cachePath)) {
		texylaError(2);
	}
	global $TexylaPluginPath;
	
	$t = <<< EEE
	<link rel="stylesheet" href="{$TexylaPluginPath}texyla/texyla/css/style.css" type="text/css">

	<!-- Texyla -->
	<script src="{$TexylaPluginPath}texyla/texyla/texyla.loader.js" type="text/javascript"></script>

	<!-- init -->
	<script type="text/javascript">
		//<![CDATA[
		
		$(function () {
			$.texyla("setDefaults", {
				texyCfg: "admin",
				baseDir: "{$TexylaPluginPath}texyla/texyla"
			});
				
			$("#content").texyla({
				toolbar: [
					'h1', 'h2', 'h3', 'h4',
					null,
					'bold', 'italic',
					null,
					'center', ['left', 'right', 'justify'],
					null,
					'ul', 'ol', ["ol_alphabet_small", "ol_alphabet_big", "ol_romans", "ol_romans_small"],
					null,
					'link', 'img', 'table', 'emoticon',
					null,
					'file_upload', 'file_browser',
					null,
					'div', ['html', 'blockquote', 'text', 'comment'],
					null,
					'code',	['code_html', 'code_css', 'code_js', 'code_php', 'code_sql'], 'code_inline',
					null,
					['sup', 'sub', 'del', 'acronym', 'hr', 'notexy', 'web']
				],
				texyCfg: "admin",
				bottomLeftToolbar: ['edit', 'preview', 'htmlPreview'],
				bottomRightPreviewToolbar: ['syntax'],
				buttonType: "button"
			});
			
		});
		//]]>
	</script>
	
EEE;
	echo $t;
}


/**
* přidá css a vše potřebné pro spuštění Texyly do hlavičky 
* stránky u komentářů
*/
function texylaCommentAddHead() {
	global $TexylaPluginPath;

	$t = <<< EEE
	<link rel="stylesheet" href="{$TexylaPluginPath}texyla/texyla/css/style.css" type="text/css">

	<!-- Texyla -->
	<script src="{$TexylaPluginPath}texyla/texyla/texyla.loader.js" type="text/javascript"></script>

	<!-- init -->
	<script type="text/javascript">
		//<![CDATA[
		
		$(function () {
			$.texyla("setDefaults", {
				texyCfg: "forum"
			});

			$("#comment").texyla({
				buttonType: "button",
				bottomLeftToolbar: ['edit', 'preview'],
				baseDir: "{$TexylaPluginPath}texyla/texyla"
			});
		});
		//]]>
	</script>
	
EEE;
	echo $t;
}


/**
* Z textu uděláme md5 otisk a ten se použije jako název souboru v cache
* ověříme jestli existuje soubor v keši a když ne tak se vygeneruje nové html 
* a to se uloží do cache a zároveň vrátí...
* pro obsah článků
* @param string text
* @return string html
*/
function texylaToTexyContent($text) {
	global $id;
	
	if ((!empty($_GET['action'])) && ($_GET['action'] == 'edit')) {
		return $text;
	}
	$cacheId = md5($text);
	$html = texylaReadToCache($cacheId);
	if (is_string($html)) {
		return $html;
	}
	$html = texyla($text, "admin");
	texylaWriteToCache($cacheId, $html);
	return $html;
}


/**
* stejně jako ředchozí, jen pro komentáře
* @param string text
* @param string html
*/
function texylaToTexyComment($text) {
	global $id;

	$cacheId = md5($text) . '-comments';
	$html = texylaReadToCache($cacheId);
	if (is_string($html)) {
		return $html;
	}
	$html = texyla($text, "forum");
	texylaWriteToCache($cacheId, $html);
	return $html;
}


/**
* Vybere z cache html verzi příspěvku
* @param int id příspěvku
* @return string vygenerovaná html stránka
*/
function texylaReadToCache($id) {
	global $Texyla_cachePath;
	$file = $Texyla_cachePath . $id . '.html';
	if (is_file($file)) {
		$cache = file_get_contents($file);
		if ($cache) {
			$cache = @unserialize($cache);
			if (is_array($cache)) {
				return $cache[0];
			}
		}
	}
	return FALSE;
}


/**
* uloží do cache html verzi příspěvku
* @param int id příspěvku
* @param string vygenerovaná html stránka
*/
function texylaWriteToCache($id, $html) {
	global $Texyla_cachePath;
	if (is_writable($Texyla_cachePath)) {
		$file = $Texyla_cachePath . $id . '.html';
		file_put_contents($file, serialize(array(0 => $html)));
		chmod($file, 0777); // set permisions
	}
}


/**
* WordPress upload handler by krteczek
* @param string $_FILES[name]
* @return array (filename => 'filename', error => '') || (filename => '', error => 'text error message') 
*/
function texylaUploadHandler($name) {
	// je uživatel přihlášen a má právo nahrávat soubory?
	if (!current_user_can('upload_files')) {
		wp_die(__('You do not have permission to upload files.'));
	}

	$t = wp_handle_upload($name , array('test_form' => false));
	if (is_array($t)) {
		if (empty($t['error'])) {
			return array('filename' => $t['url'], 'error' => '');
		}
		return array('filename' => '', 'error' => $t['error']);
	}
	return array('filename' => '', 'error' => $t);
}


/** remove WordPress default filters! **/

// Comments wp 1.5
remove_filter('pre_comment_content', 'stripslashes', 1);
remove_filter('pre_comment_content', 'wp_filter_kses');
remove_filter('pre_comment_content', 'wp_rel_nofollow', 15);
remove_filter('pre_comment_content', 'balanceTags', 30);
remove_filter('pre_comment_content', 'addslashes', 50);
remove_filter('comment_save_pre', 'balanceTags', 50);
# remove_filter('content_edit_pre',
wp_deregister_script('quicktags');

// Comments wp 1.2 & 1.5
remove_filter('comment_text', 'wptexturize');
remove_filter('comment_text', 'convert_chars');
remove_filter('comment_text', 'make_clickable');
remove_filter('comment_text', 'wpautop', 30);
remove_filter('comment_text', 'convert_smilies', 20);
remove_filter('comment_text', 'balanceTags');
remove_filter('comment_text', 'wp_filter_kses');

// Content wp 1.5
remove_filter('content_save_pre', 'balanceTags', 50);
remove_filter('excerpt_save_pre', 'balanceTags', 50);

// Content wp 1.2 & 1.5
remove_filter('the_content', 'wptexturize');
remove_filter('the_content', 'convert_smilies');
remove_filter('the_content', 'convert_chars');
remove_filter('the_content', 'wpautop');

remove_filter('the_excerpt', 'wptexturize');
remove_filter('the_excerpt', 'convert_smilies');
remove_filter('the_excerpt', 'convert_chars');
remove_filter('the_excerpt', 'wpautop');
remove_filter('the_content', 'prepend_attachment');
wp_deregister_script('quicktags');
/**
* Use Texyla filters
*/
add_action('admin_head', 'texylaAdminAddHead');
add_action('wp_head', 'texylaCommentAddHead');

add_filter('comment_text', 'texylaToTexyComment');
add_filter('the_content', 'texylaToTexyContent'); 
add_filter('the_excerpt', 'texylaToTexyContent');
add_filter('the_content_rss',  'texylaToTexyContent');
add_filter('the_excerpt_rss',  'texylaToTexyContent');
add_filter('comment_text_rss', 'texylaToTexyComment');


